import { defineStore } from 'pinia'
import { ref, computed } from 'vue'
import { createRequest } from '@/utils/request'

// 区域数据接口
interface AreaData {
  label: string
  value: string
  children?: AreaData[]
}

// 接口返回的区域数据接口
interface ApiAreaData {
  id: string
  parentId: string
  regionCode: string
  regionName: string
  regionLevel: number
  description: string
  sortOrder: number
  child?: ApiAreaData[]
}

// 接口返回的数据结构
interface ApiResponse {
  code: number
  msg: string
  data: ApiAreaData[]
}

export const useAreaStore = defineStore('area', () => {
  // 区域数据状态
  const areaData = ref<AreaData[]>([])
  const areaDataLoaded = ref(false)
  const areaDataLoading = ref(false)

  // 从本地存储初始化区域数据
  const initAreaData = () => {
    try {
      const stored = uni.getStorageSync('areaData')
      if (stored) {
        areaData.value = stored
        areaDataLoaded.value = true
        console.log('从本地存储加载区域数据成功')
        return true
      }
    } catch (error) {
      console.warn('读取区域数据本地存储失败:', error)
    }
    return false
  }

  // 数据转换函数：将接口数据转换为组件使用的格式
  const transformApiData = (apiData: ApiAreaData[]): AreaData[] => {
    return apiData.map(item => ({
      label: item.regionName,
      value: item.id,
      children: item.child ? transformApiData(item.child) : undefined
    }))
  }

  // 获取区域数据
  const fetchAreaData = async () => {
    // 如果已经加载过，直接返回
    if (areaDataLoaded.value) {
      return areaData.value
    }
    
    // 如果正在加载，直接返回现有数据
    if (areaDataLoading.value) {
      return areaData.value
    }
    
    areaDataLoading.value = true
    try {
      // 使用真实接口
      const response: ApiResponse = await createRequest('/region/getHierarchy')
      
      // 验证接口返回数据
      if (response.code === 200 && response.data && Array.isArray(response.data)) {
        // 转换数据格式
        const transformedData = transformApiData(response.data)
        areaData.value = transformedData
        areaDataLoaded.value = true
        
        // 保存到本地存储
        try {
          uni.setStorageSync('areaData', transformedData)
          console.log('区域数据已保存到本地存储')
        } catch (error) {
          console.warn('保存区域数据到本地存储失败:', error)
        }
        
        return transformedData
      }
    } catch (error) {
      console.error('获取区域数据失败:', error)
      return []
    } finally {
      areaDataLoading.value = false
    }
  }

  // 格式化区域显示文本（支持多级）
  const formatAreaDisplay = (items: any[]): string => {
    if (items.length === 0) return ''
    if (items.length === 1) return items[0].label
    if (items.length === 2) return `${items[0].label}—${items[1].label}`
    if (items.length === 3) return `${items[0].label}—${items[1].label}—${items[2].label}`
    // 支持更多层级
    return items.map(item => item.label).join('—')
  }

  // 根据选择的值获取显示文本
  const getAreaDisplayByValue = (values: string[]): string => {
    if (!values || values.length === 0) return ''
    
    const selectedItems = []
    let currentLevel = areaData.value
    
    for (const value of values) {
      const item = currentLevel.find(item => item.value === value)
      if (item) {
        selectedItems.push(item)
        currentLevel = item.children || []
      } else {
        break
      }
    }
    
    return formatAreaDisplay(selectedItems)
  }

  // 计算属性：区域数据是否可用
  const isAreaDataAvailable = computed(() => {
    return areaDataLoaded.value && areaData.value.length > 0
  })

  // 初始化时尝试从本地存储加载
  initAreaData()

  return {
    // 状态
    areaData,
    areaDataLoaded,
    areaDataLoading,
    isAreaDataAvailable,
    
    // 方法
    fetchAreaData,
    formatAreaDisplay,
    getAreaDisplayByValue
  }
}) 